package dao

import (
	"fmt"
	"go.uber.org/zap"
	"gorm.io/gorm"
	"runtime"
	"seichat/biz"
)

func handleGormError(tx *gorm.DB) error {
	if tx.Error != nil {
		_, file, line, _ := runtime.Caller(2)
		zap.L().Error("数据库错误", zap.String("location", fmt.Sprintf("%s:%d", file, line)), zap.Error(tx.Error))
		return biz.DBError
	}
	return nil
}

func EnsureRelationRecordFound(tx *gorm.DB) error {
	if err := handleGormError(tx); err != nil {
		return err
	}
	switch tx.RowsAffected {
	case 0:
		return biz.RecordNotFound
	case 1:
		return biz.AlreadyRegister
	}
	return nil
}

// EnsureRecordFound 确保查询结果存在
func EnsureRecordFound(tx *gorm.DB) error {
	if err := handleGormError(tx); err != nil {
		return err
	}
	switch tx.RowsAffected {
	case 0:
		zap.L().Info("记录不存在")
		return biz.RecordNotFound
	case 1:
		zap.L().Warn("用户已存在")
		return biz.AlreadyRegister
	default:
		// 多条记录匹配，通常不适用于单条查询
		return nil
	}
}

// EnsureRecordUpdated 确保更新至少影响一行
func EnsureRecordUpdated(tx *gorm.DB) error {
	if err := handleGormError(tx); err != nil {
		return err
	}
	switch tx.RowsAffected {
	case 0:
		zap.L().Error("更新失败", zap.Int64("rows affected", tx.RowsAffected))
		return biz.UpdateRecordError
	default:
		// 影响多行也可能合法，例如批量更新
		return nil
	}
}

// EnsureRecordDeleted 确保删除至少影响一行
func EnsureRecordDeleted(tx *gorm.DB) error {
	if err := handleGormError(tx); err != nil {
		return err
	}
	switch tx.RowsAffected {
	case 0:
		zap.L().Error("删除失败，未找到目标记录", zap.Int64("rows affected", tx.RowsAffected))
		return biz.DeleteRecordNotFound
	default:
		// 删除多条记录也可能合法，如批量删除
		zap.L().Info("删除成功", zap.Int64("rows affected", tx.RowsAffected))
		return nil
	}
}
